// ===========================================================================
// Copyright (c) 2011-2020 Anlogic Inc. All Right Reserved.
//
// TEL: 86-21-61633787
// WEB: http://www.anlogic.com/
// ===========================================================================
//
//
//  
//
//
// ===========================================================================

`timescale 1 ns/1 ps

`define EG4

//***********************//
module FDPE (
	input C,
	input CE,
	input PRE,
	input D,
	output Q
);

	parameter 	INIT 	= 	1'b1;      // 初始化参数
	reg 		q_o;
	initial 	q_o 	= 	INIT;
	assign 		Q 		= 	q_o;

	always @ (posedge PRE or posedge C) begin
		if (PRE) begin				// 如果 PRE 为 1，那么输出立即为 1
			q_o <= 1'b1;
		end
		else if (CE) begin			// 如果 CE 为 1 ，那么输出等于输入
			q_o <= D;
		end
	end


	// 描述路径延迟的关键词
	specify
		// 从PRE上升沿开始，从PRE到Q的上升沿延迟为0，下降延迟为0，
		// Q 会 变为 1
		(posedge PRE => (Q +: 1'b1)) = (0, 0);
		if (!PRE && CE) 
			// 如果PRE 为0，且 CE 为1
			// 从C上升沿开始，Q延迟100，改为D
			(posedge C => (Q +: D)) = (100, 100);
		
			
	endspecify

endmodule


//***********************//
module FD (
    input C,
    input D,
    output Q
);

    parameter INIT = 1'b0;

    reg     q_o;
    initial q_o = INIT;
    assign  Q = q_o;

    always @ (posedge C) begin
        q_o <= D;     
    end


    specify
        // Q 会在C 的上升沿时候，改为D值
        (posedge C => (Q +: D)) = (0, 0);
    endspecify

endmodule

//***********************//
/* module BUFGMUX(
    input I0,
    input I1,
    input S,
    output O
    );

    parameter CLK_SEL_TYPE = "SYNC";
    localparam clk_sel_in = (CLK_SEL_TYPE == "ASYNC") ? "1" : "0";

    `ifdef AL3
     AL_LOGIC_BUFGMUX #(.INIT_OUT(clk_sel_in))
                  BUFGMUX_AL3(.o(O),
                              .i0(I0),
                              .i1(I1),
                              .s(S)
                             );
    `endif                       

    `ifdef EG4
     EG_LOGIC_BUFGMUX #(.INIT_OUT(clk_sel_in))
                  BUFGMUX_EG4(.o(O),
                              .i0(I0),
                              .i1(I1),
                              .s(S)
                             );
    `endif

    `ifdef EF2
     EF2_LOGIC_BUFGMUX #(.INIT_OUT(clk_sel_in))
                   BUFGMUX_EF2(.o(O),
                               .i0(I0),
                               .i1(I1),
                               .s(S)
                              );
    `endif

endmodule

 */
 
//***********************//
module BUFG(
    input I,
    output O
    );
     EG_LOGIC_BUFG BUFG_EG4(
     	.o(O),
     	.i(I)
     );

endmodule


